home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / dshell / dsh333bs.lzh / scrn.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-12-05  |  9.8 KB  |  597 lines

  1. /*
  2.     dshell    v3
  3.  
  4.     画面表示初期化等
  5. */
  6.  
  7.  
  8. #include    "dsh.h"
  9. #define    FKEY_COLOR    5
  10. #define    TITLE_COLOR    1
  11.  
  12. static void p_fpt_sub(int , int );
  13.  
  14.  
  15. /*
  16.     テキスト/グラフィックパレットの設定/取得
  17. */
  18. int
  19. dpalet(int paletNo, int color)
  20. {
  21.     switch (paletNo) {
  22.     case -3:
  23.     case -2:
  24.     case -1:
  25.         return TPALET(-paletNo, color);
  26.     case 0:
  27.         if (color >= 0) {
  28.             ushort r, g, b;
  29.  
  30.             g = (ushort)color;
  31.             b = (g >> 1) & 0x1f;
  32.             r = (g >> 6) & 0x1f;
  33.             g = (g >> 11);
  34.             b = (b * 4) / 5;
  35.             r = (r * 4) / 5;
  36.             g = (g * 4) / 5;
  37.             GPALET(15, (g << 11) | (r << 6) | (b << 1));
  38.         }
  39.         /* NOBREAK */
  40.     default:
  41.         return GPALET(paletNo, color);
  42.     }
  43. }
  44.  
  45. /*
  46.     テキスト/グラフィック(GMODE=0 時のみ)パレット初期化
  47. */
  48. void initPalet(void)
  49. {
  50.     vsync();
  51.     TPALET(0, 0);
  52.     TPALET(1, tx_col[1]);
  53.     TPALET(2, (GMODE) ? 1 : tx_col[2]);
  54.     TPALET(3, (GMODE) ? 0xffff : tx_col[3]);
  55.     TPALET(4, -2);
  56.     TPALET(8, -2);
  57.  
  58.     if (!GMODE) {
  59.         int i;
  60.         for (i = 0; i < 5; i++)
  61.             dpalet(i, gr_col[i]);
  62.     }
  63. }
  64.  
  65. void
  66. resetBG(void)
  67. {
  68.     ushort c = GPALET(0, -1);
  69.     vsync();
  70.     GPALET(0, c);
  71.     GPALET(15, c);
  72.     if (bgCut != NULL && bgCut->type >= 0)
  73.         bgPutCut(bgCut, 15);
  74.     else
  75.         fill(0, 16, 767, 495, 0);
  76. }
  77.  
  78.  
  79. /*
  80.     画面初期化
  81.     initScrnFlag: 画面モードの設定が必要かどうかのフラグ
  82.                   (set_g_mode 直後のみ FALSE を指定)
  83. */
  84. void 
  85. din(int initScrnFlag)
  86. {
  87.     int i;
  88.     int mx, my;
  89.  
  90.     /* [穴]の位置 */
  91.     static const char ox[][2] = {
  92.         {2, 20},    /* 日時 */
  93.         {81, 5},    /* child */
  94.         {90, 4},    /* 終了 */
  95.         {-1, -1}
  96.     };
  97.  
  98.     OS_CUROF();
  99.     mspos(&mx, &my);
  100.     mouse(0);
  101.     mouse(4);
  102.     clr_kbf();
  103.  
  104.     getFont16(&defFont16);
  105.  
  106.     if (GMODE) {
  107. //        B_PRINT("Dしばらくお待ちください");
  108.         vsync();
  109.         B_WPOKE(VIDEOR2, B_WPEEK(VIDEOR2) & 0xff9f);
  110.         cls();
  111.         g_push(FALSE);
  112.     } else if (initScrnFlag) {
  113.         vsync();
  114.         B_WPOKE(VIDEOR2, 0);
  115.         C_WIDTH(1);
  116.         vsync();
  117.         B_WPOKE(VIDEOR2, 0);
  118.         if (bgCut != NULL && bgCut->type >= 0)
  119.             bgPutCut(bgCut, 15);
  120.     }
  121.     B_CONSOL(0, 0, 128 - 1, 64 - 1);
  122.     msarea(0, 0, GWIDTH - 1, 511);
  123.     setmspos(mx, my);
  124.  
  125.     initPalet();
  126.     setWidth();
  127.  
  128.     if (!(GMODE)) {
  129.         fill(0, 0, 767, 15, 1);        /* メニューバー上 */
  130. //        fill(0, 16, 767, 495, 0);    /* 主背景 */
  131.  
  132.         for (i = 0; ox[i][0] >= 0; i++) {
  133.             fill(8 * ox[i][0], 1, 8 * (ox[i][0] + ox[i][1]) - 1, 14, 2);
  134.         }
  135.     }
  136.  
  137.     Init_Upper_Bar();
  138.     Init_Under_Bar();
  139.     B_COLOR(3);
  140.  
  141.     if (!GMODE && initScrnFlag) {
  142.         vsync();
  143.         B_WPOKE(VIDEOR2, 0x0030);
  144.     }
  145. //    mouse(1);
  146. }
  147.  
  148. /*
  149.     
  150. */
  151. void 
  152. Init_Upper_Bar(void)
  153. {
  154.     p_title(Titlename);
  155.     if (!(GMODE)) {
  156.         p_time(1);
  157.         B_PUTMES(FKEY_COLOR, 80, 0, 14 - 1, "9Child  10終了");
  158.     } else {
  159.         B_PUTMES(FKEY_COLOR, 0, 0, 7 - 1, " 画像  ");
  160.         g_mask(1, 0, "____");
  161.         B_PUTMES(FKEY_COLOR, 47, 0, 17 - 1, "   9Child 10終了 ");
  162.         g_mask(51, 0, "_____   ____");
  163.     }
  164. }
  165.  
  166. /*
  167.     アンダーバーの初期化
  168. */
  169. void 
  170. Init_Under_Bar(void)
  171. {
  172.     int i;
  173.     static const char ox[][2] = {
  174.         {2, 4},        /* 頭末 */
  175.         {9, 4},        /* 改頁 */
  176.         {16, 4},    /* 改区 */
  177.         {23, 4},    /* 改行 */
  178.         {30, 3},    /* RGB */
  179.         {35, 4},    /* MESH */
  180.         {41, 4},    /* FIND */
  181.         {47, 4},    /* LOAD */
  182.         {53, 4},    /* 印刷 */
  183.         {59, 4},    /* MENU */
  184.         {82, 5},    /* bar */
  185.         {90, 4},    /* 復帰 */
  186.         {-1, -1}
  187.     };
  188.  
  189.     if (!(GMODE)) {
  190.         /* テキスト座標で与えられています↓ */
  191.  
  192.         fill(0, 496, 767, 511, 1);    /* メニューバー下 */
  193.  
  194.         for (i = 0; ox[i][0] >= 0; i++) {
  195.             fill(8 * ox[i][0], 497, 8 * (ox[i][0] + ox[i][1]) - 1, 510, 2);
  196.         }
  197.  
  198.         /*    ファンクションキーの番号を付けてあるのです    */
  199.         B_PUTMES(FKEY_COLOR, 0, 31, 96 - 1, " 1頭末2 3改頁4 5改区6 7改行8 RGB MESH FIND LOAD 印刷 MENU");
  200.     } else {
  201.         B_PUTMES(FKEY_COLOR, 0, 31, 64 - 1, " 1頭末2 3改頁4 5改区6 7改行8                     印刷 MENU");
  202.         g_mask(2, 31, "____   ____   ____   ____                _____ ____ ____ ____");
  203.     }
  204.     p_fpt(1);
  205. }
  206.  
  207.  
  208.  
  209. /*
  210.     日付表示
  211.     aflg:時間(秒)の変化がなくても強制再表示 のフラグ
  212. */
  213. void
  214. p_time(int aflg)
  215. {
  216.     static olddate = 0, oldtime = 0;
  217.     const char *youbi = "日月火水木金土";
  218.     union {
  219.         struct {    /* GETDATE()用ビットフィールド */
  220.             unsigned int  :13;
  221.             unsigned int w:3;
  222.             unsigned int y:7;    /* 1980からの相対年数 */
  223.             unsigned int m:4;
  224.             unsigned int d:5;
  225.         } bit;
  226.         unsigned int body;
  227.     } dt;
  228.     union {
  229.         struct {    /* GETTIM2()用ビットフィールド */
  230. #if 0
  231.             unsigned int  :11;
  232.             unsigned int h:5;
  233.             unsigned int  :2;
  234.             unsigned int m:6;
  235.             unsigned int  :2;
  236.             unsigned int s:6;
  237. #else
  238.             unsigned short h;
  239.             unsigned char m;
  240.             unsigned char s;
  241. #endif
  242.         } bit;
  243.         unsigned int body;
  244.     } tm;
  245.  
  246.     B_LOCATE(0, 30);    // for 電卓
  247.     if (GMODE) {
  248.         return;
  249.     }
  250.     tm.body = GETTIM2();
  251.     if (tm.body != oldtime || aflg) {
  252.         char buf[64];
  253.  
  254.         oldtime = tm.body;
  255.         TIMEASC(tm.body, buf);
  256.         B_PUTMES(TITLE_COLOR, 14, 0, 8 - 1, buf);
  257.         if (tm.bit.s && !aflg) {
  258.             return;
  259.         }
  260.         dt.body = GETDATE();
  261.         if (dt.body != olddate || aflg) {
  262.             olddate = dt.body;
  263.             sprintf(buf, "%02d/%02d/%02d(%2.2s)",
  264.                 (dt.bit.y + 80) % 100,    /* 「% 100」は為念(2000年以降でないと無意味) */
  265.                 dt.bit.m,
  266.                 dt.bit.d,
  267.                 youbi + dt.bit.w * 2);
  268.             B_PUTMES(TITLE_COLOR, 2, 0, 12 - 1, buf);
  269.         }
  270.     }
  271. }
  272.  
  273.  
  274. /*
  275.     現在時刻部分の別表示
  276.  
  277.     起動時間表示(左クリック)
  278.  
  279. */
  280. void 
  281. p_otm(void)
  282. {
  283.     int dmx, dmy, bl, br;
  284.     int day, tim;
  285.     char buf[96];
  286.  
  287.     if (GMODE) {
  288.         return;
  289.     }
  290.  
  291.     B_PUTMES(TITLE_COLOR, 2, 0, 7 - 1, "OnTime:");
  292.     do {
  293.         asm("
  294.             moveq #$7f,d0    * IOCS _ONTIME
  295.             trap #15
  296.             move.l d0,%0
  297.             move.l d1,%1" : "=g"(tim), "=g"(day) : : "d0", "d1" );
  298.  
  299.         sprintf(buf, "%4d:%02d'%02d\"%02d",
  300.             (day * 24 + tim / 100 / 60 / 60) % 10000,    /* 4桁化 */
  301.             tim / 100 / 60 % 60,
  302.             tim / 100 % 60,
  303.             tim % 100);
  304.         B_PUTMES(TITLE_COLOR, 9, 0, 13 - 1, buf);
  305.         dmsstat(&dmx, &dmy, &bl, &br);
  306.     } while (bl);
  307.  
  308.     p_time(1);
  309. }
  310.  
  311. /*
  312. */
  313. static size_t
  314. heapLeft(void)
  315. {
  316.     void *p;
  317.     int minSize = 0, maxSize = (_HEND - _HSTA);
  318.     int n;
  319.  
  320.     while (minSize <= maxSize) {
  321.         n = (minSize + maxSize) / 2;
  322.         p = malloc(n);
  323.         if (p == NULL) {
  324.             maxSize = --n;
  325.         } else {
  326.             free(p);
  327.             minSize = ++n;
  328.         }
  329.     }
  330.     return --minSize;
  331. }
  332.  
  333.  
  334. /*
  335.     現在時刻部分の別表示
  336.  
  337.     フリーエリアサイズ(右クリック)
  338. */
  339. void 
  340. p_freearea(void)
  341. {
  342.     int dmx, dmy, mbl, mbr;
  343.     size_t n;
  344.     char buf[32];
  345.  
  346.     if (GMODE) {
  347.         return;
  348.     }
  349.  
  350.     n = chkml();
  351.     if (debugMode) {
  352.         ushort shiftKeys = (B_SFTSNS() & (SHIFT_KEY | OPT1_KEY | OPT2_KEY));
  353.         if (shiftKeys == OPT1_KEY)
  354.             n = heapLeft();
  355.         else if (shiftKeys == OPT2_KEY)
  356.             n = getSp() - _SSTA;
  357.     }
  358.     sprintf(buf, "%9d bytes Free", n);
  359.     B_PUTMES(TITLE_COLOR, 2, 0, 20 - 1, buf);
  360.     do {
  361.         dmsstat(&dmx, &dmy, &mbl, &mbr);
  362.     } while (mbr);
  363.  
  364.     p_time(1);
  365. }
  366.  
  367. /*
  368.     メインタイトル表示
  369. */
  370. void
  371. p_title(const uchar *str)
  372. {
  373.     int sx = GMODE ? 6 : 27;
  374.     int n, d;
  375.  
  376.     n = strlen(str);
  377.     d = (42 - n) / 2;    // 42は最大桁
  378.     B_PUTMES(3, sx, 0, d - 1, "");
  379.     B_PUTMES(5, sx + d, 0, 42 - d - 1, str);
  380. }
  381.  
  382.  
  383. /*
  384.     現バージョン表示
  385. */
  386. void 
  387. p_ver(void)
  388. {
  389.     p_title(Sysmes3);
  390.     wait_mb_off();
  391.     p_title(Titlename);
  392. }
  393.  
  394.  
  395. /*
  396.     ファイル名表示
  397. */
  398. void 
  399. p_file()
  400. {
  401.     p_title(filename);
  402.     wait_mb_off();
  403.     p_title(Titlename);
  404. }
  405.  
  406. /*
  407.     現在行数表示(数値・グラフィック)
  408.     0 = normal
  409.     1 = init
  410.     2 = for Realtime_Scroll()
  411.     3 = ~BAR~
  412.     4 = _BAR_
  413. */
  414. void 
  415. p_fpt(int n)
  416. {
  417.     int mx, my;
  418.     static int olpmy = -1;
  419.     char buf[96];
  420.     static const short xl[3] =
  421.     {82, 43, 43};
  422.  
  423.     switch (n) {
  424.     case 0:
  425.         p_fpt_sub(30, 0);
  426.         break;
  427.     case 1:
  428.         if (!GMODE) {
  429.             fill(528, 498, 639, 509, 3);
  430.         }
  431.         p_fpt_sub(30, 1);
  432.         break;
  433.     case 2:
  434.         p_fpt_sub(Rwin_len, 0);    /* Realtime_Scroll()と連動 */
  435.         break;
  436.     case 3:
  437.         if (olpmy != -1) {
  438.             B_PUTMES(TITLE_COLOR, xl[GMODE], 31, 5 - 1, "上bar");
  439.             if (GMODE) {
  440.                 g_mask(xl[GMODE], 31, "_____");
  441.             }
  442.         }
  443.         olpmy = -1;    /* dummy */
  444.         return;
  445.     case 4:
  446.         if (olpmy != -2) {
  447.             B_PUTMES(TITLE_COLOR, xl[GMODE], 31, 5 - 1, "下bar");
  448.             if (GMODE) {
  449.                 g_mask(xl[GMODE], 31, "_____");
  450.             }
  451.         }
  452.         olpmy = -2;    /* dummy */
  453.         return;
  454.     default:
  455.         return;
  456.     }
  457.  
  458.     dmspos(&mx, &my);
  459.     my /= 16;
  460.     if (my > 30) {
  461.         my = 1;
  462.     }
  463.     if (n == 1 || olpmy != lp + my) {
  464.         olpmy = lp + my;
  465.         sprintf(buf, "%5d", olpmy);
  466.         B_PUTMES(TITLE_COLOR, xl[GMODE], 31, 5 - 1, buf);
  467.         if (GMODE) {
  468.             g_mask(xl[GMODE], 31, "_____");
  469.         }
  470.     }
  471. }
  472.  
  473.  
  474. static void 
  475. p_fpt_sub(int lin, int init_flg)
  476. {
  477.     static int olp, olpmx, olin;
  478.  
  479.     if (GMODE) {
  480.         return;
  481.     }
  482.  
  483.     if (olp == lp && olin == lin && olpmx == lpmx && !init_flg) {
  484.         return;
  485.     }
  486.     fill(528, 498, 639, 509, 3);
  487.     if (lpmx > 0) {
  488. #define    BAR_WIDTH    112
  489.         int x0, x1;
  490.  
  491.         if (lpmx > 30) {
  492.             x0 = (BAR_WIDTH * lp) / lpmx;
  493.             x1 = (BAR_WIDTH * (lp + lin) + lpmx / 2) / lpmx;
  494.         } else {
  495.             int d = lp + 30;
  496.             x0 = (BAR_WIDTH * lp) / d;
  497.             x1 = (BAR_WIDTH * (lp + lin) + d / 2) / d;
  498.         }
  499.         if (x1 - x0 < 3)
  500.             x1 = x0 + 3;
  501.         if (x1 > BAR_WIDTH) {
  502.             x0 -= x1 - BAR_WIDTH;
  503.             if (x0 < 0)
  504.                 x0 = 0;
  505.             x1 = BAR_WIDTH;
  506.         }
  507.         fill(528 + x0, 498, 528 + x1 - 1, 509, 4);
  508.     }
  509.     olp = lp;
  510.     olin = lin;
  511.     olpmx = lpmx;
  512. }
  513.  
  514.  
  515. /*
  516.     復帰(反転)表示
  517. */
  518. void 
  519. p_fukki(void)
  520. {
  521.     if (GMODE) {
  522.         B_PUTMES((nest) ? FKEY_COLOR : 0, 59, 31, 4 - 1, "復帰");
  523.         g_mask(59, 31, "____");
  524.     } else {
  525.         B_PUTMES((nest) ? FKEY_COLOR : 2, 90, 31, 4 - 1, "復帰");
  526.     }
  527. }
  528.  
  529. /*
  530.     画面モードを復帰
  531. */
  532. void 
  533. dout()
  534. {
  535.     int i;
  536.     int mx, my;
  537.  
  538.     mouse(2);
  539.     B_COLOR(3);
  540.     if (!GMODE) {
  541.         vsync();
  542.         B_WPOKE(VIDEOR2, 0);
  543.         C_WIDTH(0);
  544.     }
  545.     vsync();
  546.     cls();
  547.     for (i = 0; i <= 4; i++) {
  548.         TPALET(i, -2);
  549.     }
  550.     TPALET(8, -2);
  551.     mspos(&mx, &my);
  552.     mouse(0);
  553.     setmspos(mx, my);
  554.     clr_kbf();
  555.     OS_CURON();
  556. }
  557.  
  558.  
  559. void 
  560. use_fnk()
  561. {
  562.     C_FNKMOD(3);
  563.     C_WINDOW(0, 32);
  564. }
  565.  
  566.  
  567. void 
  568. nouse_fnk()
  569. {
  570.     C_FNKMOD(0);
  571.     C_WINDOW(0, 31);
  572. }
  573.  
  574.  
  575. void
  576. setWidth(void)
  577. {
  578.     static const char widthTable[] = { 96, 64, 64, };
  579.  
  580.     CWIDTH = widthTable[GMODE];
  581.     GWIDTH = CWIDTH << 3;
  582. }
  583.  
  584. void
  585. initKeyBuffer(void)
  586. {
  587. // ソフトウェアキーボード対策... (全キーをキーOFF)
  588.     asm("
  589.     moveq.l    #$ff,d1
  590. @@:    moveq.l    #5,d0
  591.     trap    #15
  592.     subq.b    #1,d1
  593.     bmi        @b
  594.     " : : : "d0", "d1");
  595.     clr_kbf();
  596. }
  597.